/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package persistencia;

import io.PersonaDTO;
import java.sql.*;

/**
 * Esta clase representa al gestor de la tabla persona que se encuentra
 * almacenada en la base de datos.
 * @author nahuel
 */
public class MySQLPersonaDAO {

    /**
     * Este mensaje permite insertar una nueva persona en la base de datos
     * @param persona
     * @throws DAOException 
     */
    public void agregarPersona(PersonaDTO persona) throws DAOException {
        Connection conexion = null;
        try {
            conexion = MySQLDAOFactory.getMySQLDAOFactory().getConexion();
            Statement stat = conexion.createStatement();
            stat.executeUpdate("insert into persona (dni,nombre,direccion,direccionActual,telefono,telefono2,fechaNacimiento,localidad,lugarTrabajo,email,observaciones,fechaRegistro,conyuge) values (" + persona.getDni() + ",'" + persona.getNombre() + "','" + persona.getDireccion() + "','" + persona.getDireccionactual() + "','" + persona.getTelefono() + "','" + persona.getTelefono2() + "','" + persona.getFechanacimiento() + "','" + persona.getLocalidad() + "','" + persona.getLugardetrabajo() + "','" + persona.getEmail() + "','" + persona.getObservaciones() + "','" + persona.getFecharegistro() + "','" + persona.getConyuge() + "')", Statement.RETURN_GENERATED_KEYS);
            ResultSet generatedKeys = stat.getGeneratedKeys();
            if (generatedKeys.next()) {
                persona.setId(generatedKeys.getInt(1));
            }
        } catch (SQLException e) {
            throw new DAOException("Error al insertar la persona en la base de datos", e);
        } finally {
            MySQLDAOFactory.getMySQLDAOFactory().cerrarConexion(conexion);
        }
    }

    /**
     * Este mensaje permite modificar los datos de una persona de la base de 
     * datos
     * @param persona
     * @throws DAOException 
     */
    public void actualizarPersona(PersonaDTO persona) throws DAOException {
        Connection conexion = null;
        try {
            conexion = MySQLDAOFactory.getMySQLDAOFactory().getConexion();
            Statement stat = conexion.createStatement();
            stat.executeUpdate("update persona set dni = " + persona.getDni() + ",nombre = '" + persona.getNombre() + "',direccion = '" + persona.getDireccion() + "',direccionActual = '" + persona.getDireccionactual() + "',telefono = '" + persona.getTelefono() + "',telefono2 = '" + persona.getTelefono2() + "',fechaNacimiento = '" + persona.getFechanacimiento() + "',localidad = '" + persona.getLocalidad() + "',lugarTrabajo = '" + persona.getLugardetrabajo() + "',email = '" + persona.getEmail() + "',observaciones = '" + persona.getObservaciones() + "',fechaRegistro = '" + persona.getFecharegistro() + "',conyuge = '" + persona.getConyuge() + "' where id = " + persona.getId());
        } catch (SQLException e) {
            throw new DAOException("Error al actualizar la persona en la base de datos", e);
        } finally {
            MySQLDAOFactory.getMySQLDAOFactory().cerrarConexion(conexion);
        }
    }

    /**
     * Este mensaje permite obtener una persona que contenga el dni que se le
     * pasa como parámetro, en caso de no existir ninguna devuelve un objeto
     * con todos sus atributos vacios
     * @param agenda
     * @return lista de agendas
     * @throws DAOException 
     */
    public PersonaDTO buscarPersona(int dni) throws DAOException {
        Connection conexion = null;
        try {
            conexion = MySQLDAOFactory.getMySQLDAOFactory().getConexion();
            Statement stat = conexion.createStatement();
            ResultSet rs = stat.executeQuery("select * from persona where dni = " + dni + " LIMIT 1");
            PersonaDTO personaDTO = null;
            if (rs != null) {
                while (rs.next()) {
                    personaDTO = new PersonaDTO(Integer.parseInt(rs.getString("id")), rs.getInt("dni"), rs.getString("nombre"), rs.getString("direccion"), rs.getString("direccionActual"), rs.getString("telefono"), rs.getString("telefono2"), rs.getDate("fechaNacimiento"), rs.getString("localidad"), rs.getString("lugarTrabajo"), rs.getString("email"), rs.getString("observaciones"), rs.getDate("fechaRegistro"), rs.getString("conyuge"));
                }
            }
            rs.close();
            return personaDTO;
        } catch (SQLException e) {
            throw new DAOException("Error al leer las personas desde la base de datos", e);
        } finally {
            MySQLDAOFactory.getMySQLDAOFactory().cerrarConexion(conexion);
        }
    }

    /**
     * Este método devuelve una persona con todos los datos si la misma posee id
     * @param persona 
     */
    public void completarPersona(PersonaDTO persona) throws DAOException {
        Connection conexion = null;
        try {
            conexion = MySQLDAOFactory.getMySQLDAOFactory().getConexion();
            Statement stat = conexion.createStatement();
            ResultSet rs = stat.executeQuery("select * from persona where id = " + persona.getId() + " LIMIT 1");
            PersonaDTO personaDTO = null;
            if (rs != null) {
                while (rs.next()) {
                    persona.setData(rs.getInt("dni"), rs.getString("nombre"), rs.getString("direccion"), rs.getString("direccionActual"), rs.getString("telefono"), rs.getString("telefono2"), rs.getDate("fechaNacimiento"), rs.getString("localidad"), rs.getString("lugarTrabajo"), rs.getString("email"), rs.getString("observaciones"), rs.getDate("fechaRegistro"), rs.getString("conyuge"));
                }
            }
            rs.close();
        } catch (SQLException e) {
            throw new DAOException("Error al leer la persona desde la base de datos", e);
        } finally {
            MySQLDAOFactory.getMySQLDAOFactory().cerrarConexion(conexion);
        }
    }
}
